home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Graphics / STIMP_noise / source / pgmmean / pgmmean.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-31  |  2.7 KB  |  139 lines

  1.  
  2. /************************************************************************/
  3. #define OP_NAME      "pgmmean"
  4. #define VERSION      "1.01"
  5. #define DATE         "30.01.98"
  6. #define AUTHOR       "Stefan Diener"
  7. /************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <math.h>
  14. #include <sys/types.h>
  15.  
  16. #include <STIMP/pgm.c>
  17.  
  18. struct PGM_Info source, desti;
  19. static int m, n;
  20. static int edge=1;
  21.  
  22. void Do_It(void)
  23. {
  24.   int i, j, k, l, index;
  25.   unsigned int su, factor;
  26.   unsigned char *src, *dst;
  27.  
  28.   src=source.Data;
  29.   dst=desti.Data;
  30.   desti.maxval=source.maxval;
  31.  
  32.   /* Skalierungsfaktor ermitteln */
  33.   factor=(2*edge+1)*(2*edge+1);
  34.  
  35.   /* Filtermaske anwenden */
  36.   for (i=edge;i<(n-edge);i++)
  37.     for (l=edge;l<(m-edge);l++)
  38.     {
  39.       index=l*n+i;
  40.       su=0;
  41.  
  42.       for (j=-edge; j<=edge; j++)
  43.         for (k=-edge; k<=edge; k++)
  44.           su+=src[index+j*n+k];
  45.  
  46.       dst[(l-edge)*(n-2*edge)+(i-edge)]=(unsigned char) (su/factor);
  47.     }
  48. }
  49.  
  50. int main(int argc,char **argv)
  51. /* Hauptprogramm */
  52. {
  53.   int i;
  54.  
  55.   /* offizielle Begruessung */
  56.   PrintOpening(argc,argv);
  57.  
  58.   /* Uebergebene Parameter auswerten */
  59.   for (i=1; i<argc; i++)
  60.   {
  61.     if ((argv[i][0]=='-') && argv[i][1])
  62.     {
  63.       switch (argv[i][1])
  64.       {
  65.         case '3': edge=1;
  66.                       break;
  67.  
  68.         case '5': edge=2;
  69.                       break;
  70.  
  71.         case '7': edge=3;
  72.                       break;
  73.  
  74.         case '9': edge=4;
  75.                       break;
  76.  
  77.         case 'v': beVerbose=FALSE;
  78.                       break;
  79.  
  80.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  81.                      Hilfe();
  82.                      exit(-1);
  83.                      break;
  84.       }
  85.     }
  86.  
  87.     if (argv[i][0]=='+')
  88.     {
  89.       switch (argv[i][1])
  90.       {
  91.         case 'v': beVerbose=TRUE;
  92.                       break;
  93.  
  94.         default: PrintMessage("Unknown parameter: %s", argv[i]);
  95.                      Hilfe();
  96.                      exit(-1);
  97.                      break;
  98.       }
  99.     }
  100.   }
  101.  
  102.   /* Mindestzahl der Argumente pruefen */
  103.   if (argc<3)
  104.   {
  105.     PrintMessage("Wrong number of arguments !");
  106.     Hilfe();
  107.     exit(-1);
  108.   }
  109.  
  110.   /* Anzahl der Dateinamen überprüfen */
  111.   if (FilenameCount(argc, argv)!=2)
  112.   {
  113.     PrintMessage("Wrong number of file names !");
  114.     Hilfe();
  115.     exit(-1);
  116.   }
  117.  
  118.   if (ReadPGMFile(GetFilename(1,argc,argv), &source)==0)
  119.   {
  120.     m=source.height;
  121.     n=source.width;
  122.  
  123.     if (CreatePGMArray(m-2*edge, n-2*edge, &desti)==0)
  124.     {
  125.       PrintMessage("Working ...");
  126.       Do_It();
  127.  
  128.       WritePGMFile(GetFilename(2,argc,argv), &desti);
  129.       FreePGMArray(&desti);
  130.     }
  131.  
  132.     FreePGMArray(&source);
  133.   }
  134.  
  135.   PrintClosing();
  136.   exit(0);
  137. }
  138.  
  139.